package java学习.实训.day02;

import java学习.算法.测试.arr;

import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * **************
 * 项目名称: 蓝桥杯 <br/>
 * 文件名称:  <br/>
 * 文件描述: 这里添加您的类文件描述,说明当前文件要包含的功能。 <br/>
 * 文件创建：刘世锦 <br/>
 * 创建时间: 2022/6/8 <br/>
 *
 * @version v1.0 <br/>
 * @update [序号][日期YYYY-MM-DD][更改人姓名][变更描述]<br/>
 * *************
 */
public class day02 {
    /*
    1.需求：有一组数据 10,8,23,41,52,66,34,12。编写代码求出数组中的最大值。
    2需求：有一个具有10个 int 数据的数组,数组中的每个元素都是[10, 100]之间的随机数。
    编写代码求出数组中的最大值,最大值下标。
     */
    public static void main1(String[] args) {
        int []arr = {10,18,23,41,52,66,34,12};
        int max = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]>max){
                max = arr[i];
            }
        }
        System.out.println(max);
    }

    public static void main2(String[] args) {
//        Function<String,String> function = new Function<String, String>() {
//            @Override
//            public String apply(String s) {
//                return null;
//            }
//        };
//        Function<String,String> function =(s)->{
//            return s;
//        };
        double $asd = 3L;
        char a = '我';
        String []arr = new String [10];
        ArrayList<String> list = new ArrayList<>(Arrays.asList(arr));
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
//            arr[i] = r.nextInt(100 - 10 + 1)+10;
        }
        int []max = new int[10];
        int m = 0;
//        for (int i = 0; i < arr.length; i++) {
//            if (arr[i]>m){
//                m = arr[i];
//            }
//        }
        for (int i = 0; i < arr.length; i++) {
//            if (arr[i]==m){
//                max[i] = i;
//            }
        }
        System.out.println(Arrays.toString(arr));
        System.out.println(m);
        System.out.println(Arrays.toString(max));
    }

    /*
    有一个包含10个元素的数组,每个元素的值在[10,30]之间,
    查找数组中是否包含18,
    如果有18,
        打印出值为18的元素的下标。
    如果没有18,
        打印“数组中不包含18”。
     */
    public static void main3(String[] args) {
        int []m = new int[10];
        int a = 0;
//        int []arr = new int[10];
//        Random r = new Random();
//        for (int i = 0; i < arr.length; i++) {
//            arr[i] = r.nextInt(30 - 10 + 1)+10;
////            if (arr[i] == 18){
////                System.out.println();
////            }
//        }
        int []arr = {10, 8,23,41,52,66,34,12};
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]==18){
                System.out.println("18下标:"+i);
                m[i] = 2;
            }else {
                m[i] = 1;
            }
        }
    }

    public static void main4(String[] args) {
        int []arr = {5,13,19,21,37,56,64,75,80,88};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        int l = 0;
        int r = arr.length-1;
        int num = 13;
        boolean find = false;
        while (l<=r){
            int mid = (l+r)/2;
            if(arr[mid] == num){
                find = true;
                break;
            }else if (num > arr[mid]){
                l = mid+1;
            }else if(arr[mid]>num){
                r = mid-1;
            }

        }
        if (find){
            System.out.println(num+"存在");
        }else {
            System.out.println(num+"不存在");
        }

    }

    public static void main5(String[] args) {
//        需求：创建一个容量为10的数组,数组前7个数分别是35,22,17,41,72,29,10。将数组下标为1的数据删除。
/*
 元素删除
 */
        int []arr = {35,22,17,41,72,29,10};
        int index = 4;
        int n = arr.length-1;
        for (int i = index; i < n; i++) {
            arr[i] = arr[i+1];

        }
        arr[n] = 0;
        System.out.println(Arrays.toString(arr));
/*
 元素插入
 */
        int []a = {35,22,17,41,72,29,10};
        int num = 4;
        int m = a.length-1;
        for (int i = m; i >num ; i--) {
            a[i] = a[i-1];
        }
        a[num] = 11;
        System.out.println(Arrays.toString(a));
    }

    public static void main6(String[] args) {
//        需求：有如下一组数{67, 42, 88, 16, 25, 3}，对其按从小到大的顺序排列。--使用选择排序
        int []arr = {35,22,17,41,72,29,10};
        int n = arr.length-1;

        for (int i = 0; i < n; i++) {
            int index = i;
            for (int j = i+1; j <=n; j++) {
                if (arr[index]>arr[j]){
                    index = j;
                }
            }
                int t =  arr[i];
               arr[i] = arr[index];
               arr[index] = t;
        }
        System.out.println(Arrays.toString(arr));
    }
    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i; // 用来记录最小值的索引位置，默认值为i
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j; // 遍历 i+1~length 的值，找到其中最小值的位置
                }
            }
            // 交换当前索引 i 和最小值索引 minIndex 两处的值
            if (i != minIndex) {
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
            // 执行完一次循环，当前索引 i 处的值为最小值，直到循环结束即可完成排序
        }
    }

    public static void main7(String[] args) {
//        1.需求：创建一个3行5列的二维数组，每个元素的取值范围是[30, 70]，求数组中的最大值以及最大值的下标。
//        2.需求：创建一个3行5列的二维数组，每个元素的取值范围是[30, 70]，求第4列的平均值。
        Random r = new Random();
        int [][]arr = new int[3][5];
        int max = 0,index = 0,jn = 0;
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                arr[i][j] = r.nextInt(70 - 30 + 1)+30;
                System.out.print (arr[i][j]+"    " );
                if (arr[i][j]>max){
                    max = arr[i][j];
                    index=i; jn = j;
                }

                if (j==3){
                    sum+=arr[i][j];
                }
            }
            System.out.println( );
        }

        System.out.println("max="+max);
        System.out.println("下标"+"  "+index+"   "+jn);
        System.out.println("第4列的平均值："+sum/3.0);
    }

    public static void main(String[] args) {
//        创建一个3行5列的二维数组，每个元素的取值范围是[30, 70]，对第2列的数据按从小到大排序。

        Random r = new Random();
        int [][]arr = new int[3][5];
        int max = 0,index = 0,jn = 0;
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = r.nextInt(70 - 30 + 1)+30;
                System.out.print (arr[i][j]+"    " );
            }
            System.out.println( );
        }
        for (int i = 0; i < arr.length -1 ; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j][1]>arr[j+1][1]){
                    int temp = arr[j][1];
                    arr[j][1] = arr[j+1][1];
                    arr[j+1][1] = temp;
                }
            }
        }
        System.out.println("-----------");
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print (arr[i][j]+"    " );
            }
            System.out.println( );
        }
            Function<String,String> function =  (s)->{
               return s;
            } ;
        function.apply("s");
        Supplier<Integer> s = ()->{
            return 1;
        };
        System.out.println(s.get());
        Consumer<Object> consumer = o ->{
          return;
        };
    }
}
